package example.hellosecurity.config;


/*
* SpringSecurity需要一个服务对象
* springSecurity提供一个接口  命名为UserDetailsService
*实现接口，实现接口的认证方法 命名为loadUserByUsername(String s)
* 方法代表，用户认证
*
*
* 抛出异常
* */

import example.hellosecurity.entity.User;
import example.hellosecurity.srevers.UserServler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;

@Component
public class UserSecurityService implements UserDetailsService {
    @Autowired
    private UserServler userServler;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("传入的参数名称" + username);
   /*     User userName = new User();
        userName.setPassword("$2a$10$qKDGIbMVopXkZfCIx8UnqOQm7gW22EBfHLMd/gmYuFg7h5Bnb6iIe");
        userName.setUsername("jack");
*/
   User user = userServler.findUserName(username);

        System.out.println("数据库查询到的数据" + user.getUsername());
        if(user==null){
            throw new UsernameNotFoundException("用户名或者密码错误");
        }


        /*
        * 用户登录成功后，查询用户的权限集合。包括角色和权限
        * 角色名称的集合
        * */
        List<String> resources = userServler.selectByUserId(user);
        /*
        * 用户登录成功后的角色名称集合roles
        * */
        List<String> roles = userServler.selectRoleByUserId(user);
//在Spring Security 中，对角色的命有严格的规则，要求角色名称的前缀必须是ROLE_.不要在数据库中保存ROLE_角色名
//在Spring Security 中    ，角色和权限的平等，都代表用户的访问权限
        
//         创建数组
        String[] authorities = new String[roles.size()+resources.size()];

        for (int i = 0; i <roles.size() ; i++) {
            authorities[i] = "ROLE_"+ roles.get(i);

        }

        for (int i = 0; i <resources.size() ; i++) {
//     roles的长度开始加
            authorities[roles.size()+i] = resources.get(i);
        }


        System.out.println("user = " + user.getUsername()+"权限集合是"+ Arrays.toString(authorities));



        /*
* 查询成功 需要匹配用户名和密码是否正确
* 匹配密码查询，是由SpringSercurity内部逻辑自动完成，只需要查询用户名是否正确
*返回结果UserDetails类型的实现类可以自己定义 可以使用Security框架提供的实现类
* security框架提供的UserDetails接口类型User 构造的时候需要三个参数或者七个参数
* 三个参数构造，用户名 密码 权限
* */
        org.springframework.security.core.userdetails.User users =
                new org.springframework.security.core.userdetails.User(
                        username,user.getPassword(), AuthorityUtils.createAuthorityList(authorities)
                );
        return users;
    }
}
